[小ネタ] AWS CloudFormation Stack の適用漏れをローカルから確認する方法
はじめに
こんにちは 田中孝明 です。
慣れ親しんだモバイルアプリサービス部(通称プリサー)が CX事業本部 に統合され、新しい部署で心機一転...と思いきや、やることはあまり変わってないです...
最近では AWS認定資格 11冠 を目指して Alexa Skill Builder -Speciality の勉強をコツコツとしています...
今回の悩みどころ
自分は現在 28個 の CloudFormation Stack でリソースの管理をしているプロジェクトに関わっています。それぞれの CloudFormation Stack は機能や構成毎に分離されており、基本は他の Stack のリソースを参照しないように構築しています。 いくつかの CloudFormation Stack はリリースフローが走ると自動で適用されるのもあるのですが、一部集中管理しないとならない Stack からリソースを参照しているものがあるため、リリース時に手動で適用している Stack があります。
この 手動で適用する という作業が曲者で、人間の手が介在する以上ミスをする可能性は避けれないです。
こちらが毎週のようにリリースを行なっているため、なるべく人の手を介在させないチェック機構を考える機会がありました。
AWS CLI を使用した確認方法
AWS CloudFormation で管理している Stack に対して、新機能の開発などでリソースに変更が発生すると、 Change Set が作成されます。この Change Set が作成されたかどうかでリリース時に適用が必要かどうかの判断ができます。この状態はAWS CLIのコマンドを組み合わせれば取得できるため、これで判断できるかどうかを見てみましょう。
必要な Stack の抽出
まずは aws cloudformation list-stacks
コマンドを使って管理している Stack の一覧を抽出しましょう。
$ aws cloudformation list-stacks --profile hoge-profile | jq -r '.[][].StackName' > list
list ファイルに管理している Stack の一覧が保存されます。
waf-logger-stack cloudwatch-stack etl-stack log-stack heartbeat-stack message-notifier-stack data-analysis-stack api-stack lambda-stack cdn-stack dynamodb-stack sns-stack kms-stack kinesis-stack event-history-stack cognito-stack cloudtrail-stack budget-stack waf-stack iam-stack s3-stack
Change Set の存在確認
先ほど作成した list ファイルに保存した Stack に対して aws cloudformation list-change-sets
コマンドを使って Change Set の存在確認をしましょう。リソースの変更がある場合は CREATE_COMPLETE
になるので、この状態のものを抽出してみます。
#!/bin/sh while read line do aws cloudformation list-change-sets --profile hoge-profile --stack-name $line | jq '.[][] | select(.Status=="CREATE_COMPLETE")' done < list
リソースの変更があるもののみが抽出されます。
{ "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/event-history-stack-stack/4f2aae40-8a64-11e8-a047-503a6ff78e2a", "Status": "CREATE_COMPLETE", "ChangeSetName": "awscli-cloudformation-package-deploy-1237778888", "Description": "Created by AWS CLI at 2018-08-13T08:57:38.998074 UTC", "CreationTime": "2018-08-13T08:57:39.694Z", "StackName": "event-history-stack", "ExecutionStatus": "AVAILABLE", "ChangeSetId": "arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/awscli-cloudformation-package-deploy-1237778888/7940bda9-b5df-40b6-b194-edbdbd8f880a" }
さいごに
変更があるものをコマンドラインから確認できるようにするだけでも、リリース時の手作業の負荷は下げられると思います。ただ、一覧で出すだけではあまり効果的とは言えないので、ゆくゆくはCircleCIのワークフローに組み込んで適用漏れを確認できるようにさせたいですね。
(全部自動で適用できるようになるのが一番いいのでしょうが...)